**************************************************************************************
	;Header frs File-linken

	IFD	Flag_project
Flag_TekknoPara	set 1
	ENDC
	IFND	Flag_TekknoPara
Flag_TekknoPara	set 0
	ENDC
	IFEQ	Flag_TekknoPara
Flag_TekknoPara	set 1
	include	Nutz_project
	ELSEIF
**************************************************************************************

	;Konstanten

			rsreset
TLax_Wait		rs.w	1	;Y_Position fr Wait
TLax_Pos_Val		rs.w	1	;Bere Pos  ScreenPos*Val/16
TLax_Pos_Divu		rs.w	1	;Wie gro ist Loop
TLax_Own_Speed		rs.w	1	;eigener Speed des Parallax
TLax_ColTab		rs.w	1	;Tabelle in denen Col1-7 steht
TLAX_ENTRYLENGTH	rs.w	0

	;Variablen
			rsreset
TVarSpeed		rs.w	1

			rsreset
TSplit_Wait		rs.w	1
TSplit_Program		rs.l	1
TSplit_XPos		rs.w	1
TSplit_YPos		rs.w	1
TSplit_Coltab		rs.w	1
TSplit_YSize		rs.w	1
TSplit_LENGTH		rs.w	0

		rsset	Task_Buffer
Tekkno_CopperList1	rs.b	16*6
Tekkno_CopperList2	rs.b	16*6
TCopper_Buffer		rs.l	1
TCopper_Help		rs.b	6
TCopper_TabPointer	rs.l	1
TYPos_Pointer		rs.l	1
TYPos_Buffer		rs.l	1
TYPos_Table1		rs.w	66
TYPos_Table2		rs.w	66
TFade_Struktur		rs.b	FADE_SIZEOF+(60+42)*6
TVBL_Handler		rs.l	1
TBalken_Color		rs.w	1
TBalken_Flag		rs.w	1
TSplit_Buffer		rs.b	16*TSplit_LENGTH
TLax_Variables		rs.b	10*TLAX_ENTRYLENGTH

MakeTekknoPara:
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
;	Wasseroberflche darstellen ???

	tst.b	Dont_render_Parallax(a6)
	bne	.do_only_color

	move.w	Water_YPos(a6),d0				;Y-Pos der Wasser-oberflche.
	sub.w	Scr_Y_Level_Pos(a6),d0
	move.w	d0,Water_SpritePos(a6)
	bgt.s	.check_lower_border

	move.l	#TSet_Dark_Color,TVBL_Handler(a6)
	bra.s	.no_other

.check_lower_border:
	move.l	#Set_Nothing,TVBL_Handler(a6)
	cmp.w	#224,d0
	bge.s	.no_other

	lea	TSplit_Buffer(a6),a0
	clr.w	TSplit_Coltab(a0)
	lea	TSplit_LENGTH(a0),a0
	move.w	d0,TSplit_Wait(a0)
	move.l	#Copper_TekknoWater,TSplit_Program(a0)

	move.w	#-1,TSplit_LENGTH(a0)

	bra	.Splits_ready
.no_other:
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
;	Hinterste Ebene berechnen
		lea	TLax_Entry_Tab(pc),a3
		lea	TSplit_Buffer(a6),a4
		lea	TLax_Variables(a6),a5
		moveq	#10-1,d7
.Lax_Loop:	;Softscroll machen
		move	Scr_X_Level_Pos(a6),d0
		moveq	#0,d1
		move.b	TLax_Own_Speed+1(a3),d1
		tst	d1
		beq.s	.NoSpeed
		add.b	d1,TVarSpeed(a5)

		move.b	TVarSpeed(a5),d1
		move	TLax_Pos_Divu(a3),d2
		lsl	#5,d2
		divu	d2,d1
		swap	d1
		move.b	d1,TVarSpeed(a5)
		lsr	#1,d1
.NoSpeed:	mulu	TLax_Pos_Val(a3),d0		;Pos*Val/16
		lsr	#4,d0
		add.w	d1,d0
		divu	TLax_Pos_Divu(a3),d0		;RoundscrollDivu
		swap	d0			;nur Rest beachten
		neg.w	d0

		;--Splits in Tabelle eintragen!

		move.w	TLax_Wait(a3),TSplit_Wait(a4)		;Erste Zeile
		move.l	#Copper_TekknoSplit,TSplit_Program(a4)
		move.w	TLax_Wait(a3),TSplit_YSize(a4)
		addq.w	#2,TSplit_YSize(a4)			;Letzte Zeile

		move.w	d0,TSplit_XPos(a4)
		clr.w	TSplit_YPos(a4)
		move.w	TLax_ColTab(a3),TSplit_Coltab(a4)

		adda	#TSplit_LENGTH,a4
		adda	#TLAX_ENTRYLENGTH,a3
		adda	#TLAX_ENTRYLENGTH,a5
		dbf	d7,.Lax_Loop
	move.w	#-1,(a4)		;Splitliste abschliessen.
	lea	TSplit_Buffer(a6),a4
	clr.w	TSplit_YSize(a4)	;Oberster Split ist 0 Zeilen lang!

;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
;	Balken positionen berechnen

	move.w	Scr_X_Level_Pos(a6),d4
	neg.w	d4
	lsr.w	#1,d4
	and.w	#31,d4

	moveq	#0,d0
	move.w	Scr_Y_Level_Pos(a6),d0
	neg.w	d0
	lsr.w	#1,d0
	divu	#256,d0
	swap	d0			;An dieser Position befindet sich der Balken!

	bsr	.calc_balken

	moveq	#0,d0
	move.w	Scr_Y_Level_Pos(a6),d0
	neg.w	d0
	add.w	#256,d0
	lsr.w	#1,d0
	divu	#256,d0
	swap	d0			;An dieser Position befindet sich der Balken!

	bsr	.calc_balken

	;Tabelle in Copperlist umrechnen!
.Splits_ready:
	lea	TSplit_Buffer(a6),a0
	move.l	TYPos_Buffer(a6),a1
	move.l	TCopper_Buffer(a6),a2

	addq.l	#4,a2			;Init-Routine berspringen

	move.w	TSplit_YPos(a0),(a1)+
	move.w	TSplit_XPos(a0),(a1)+
	move.w	TSplit_Coltab(a0),(a1)+
	adda.w	#TSplit_LENGTH,a0

.split_create_loop:
	move.w	TSplit_Wait(a0),(a2)
	bmi.s	.finish
	move.l	TSplit_Program(a0),2(a2)

	move.w	TSplit_YPos(a0),(a1)+
	move.w	TSplit_XPos(a0),(a1)+
	move.w	TSplit_Coltab(a0),(a1)+

	adda.w	#TSplit_LENGTH,a0

	addq.l	#6,a2

	bra	.split_create_loop

.finish:

	move.w	#$00ff,(a2)+		;CList abschliessen
	move.l	#Int_Nop,(a2)

	move.l	TYPos_Buffer(a6),a0
	move.l	TYPos_Pointer(a6),TYPos_Buffer(a6)
	move.l	a0,TYPos_Pointer(a6)
	move.l	TCopper_Buffer(a6),a0
	move.l	Copper_List(a6),TCopper_Buffer(a6)
	move.l	a0,Copper_List(a6)

.do_only_color:
	tst.w	TBalken_Flag(a6)
	bne.s	.dont_show_sprites
	bsr	Show_Sprite_balken
.dont_show_sprites:
	lea	TFade_Struktur(a6),a0
	bsr	Call_Transformation2

	rts

*************************************************************************************************
*******	Balken Routine									 ********
*************************************************************************************************
	;Input:
	;d0 = Y-Pos des Balkens
	;d4 = X-Pos des Balkens


.calc_balken:
	clr.w	TBalken_Color(a6)
	move.w	d0,-(sp)
	add.w	#32,d0

	moveq	#0,d6			;Flag frs Split-lschen

	tst.w	d0
	beq.s	.no_lower_split
	cmp.w	#223,d0
	blt.s	.normal_lower_split

	cmp.w	#256,d0
	ble.s	.no_lower_split
	sub.w	#256,d0			;Balken ist am oberen Rand!

.normal_lower_split
	moveq	#0,d1			;Split-Hhe

	bsr	.insert_split		;Split einfgen oder kopieren.

	tst.w	d7			;Wars ein Overwrite ??
	beq.s	.dont_use_new_colors

					;X-Position und Farbe des letzten Splits benutzen
	move.w	TSplit_XPos-TSplit_LENGTH(a0),TSplit_XPos(a0)
	move.w	TSplit_Coltab-TSplit_LENGTH(a0),TSplit_Coltab(a0)

.dont_use_new_colors:
	move.w	d0,TSplit_Wait(a0)
	move.w	d1,TSplit_YSize(a0)
	clr.w	TSplit_YPos(a0)
	move.l	#Copper_TekknoSplit_NoCols,TSplit_Program(a0)
	move.w	TSplit_Coltab(a0),TBalken_Color(a6)

	moveq	#1,d6			;Es gibt einen unteren Split
	move.l	a0,a5			;Adresse in a5.

.no_lower_split:
	move.w	(sp)+,d0

	cmp.w	#223,d0
	blt.s	.do_normal_split

	cmp.w	#224,d0
	ble	.no_split

	;Der Balken fngt in der obersten Zeile an!

	lea	TSplit_Buffer(a6),a0

	sub.w	#256,d0
	neg.w	d0
	add.w	#224,d0
	move.w	d0,TSplit_YPos(a0)
	move.w	d4,TSplit_XPos(a0)
	move.l	#Copper_TekknoSplit,TSplit_Program(a0)
	move.w	TBalken_Color(a6),TSplit_Coltab(a0)
	bra	.check_splits

.do_normal_split:

	moveq	#2,d1			;Split-Hhe

	bsr	.insert_split		;Split einfgen oder kopieren.

	move.w	d0,TSplit_Wait(a0)
	move.w	d1,TSplit_YSize(a0)

	move.w	d4,TSplit_XPos(a0)
	neg.w	d0
	add.w	#224,d0
	move.w	d0,TSplit_YPos(a0)
	move.l	#Copper_TekknoSplit,TSplit_Program(a0)
	move.w	TBalken_Color(a6),TSplit_Coltab(a0)

	;Gegebenenfalls die zwischen oberem und unterem Split liegenden anderen Splits lschen!

.check_splits:
	tst.w	d6			;Gibt es einen unteren???
	beq.s	.clear_to_end_of_table	;Nein, bis Ende der Tabelle lschen.

.check_again:
	lea	TSplit_LENGTH(a0),a1
	cmp.l	a5,a1			;Ist der End-Split direkt drunter ???
	beq.s	.no_split		;Ja, wir sind fertig!

	bsr	.remove_split		;Nein, der Split mu weg!
	lea	-TSplit_LENGTH(a5),a5
	bra.s	.check_again

	bra.s	.no_split

.clear_to_end_of_table:			;Dieser Split mu der letzte sein, alle anderen lschen.
	move.w	#-1,TSplit_LENGTH(a0)

.no_split:
	rts

*************************************************************************************************
*******	Split Support Routinen								 ********
*************************************************************************************************

	;a1 = Adresse des zu lschenden Splits.
.remove_split:
	lea	TSplit_Buffer+15*TSplit_LENGTH(a6),a2
.remove_loop:
	cmp.l	a1,a2
	beq.s	.remove_ready
	move.l	TSplit_LENGTH(a1),(a1)
	move.l	TSplit_LENGTH+4(a1),4(a1)
	move.l	TSplit_LENGTH+8(a1),8(a1)
	move.w	TSplit_LENGTH+12(a1),12(a1)
	lea	TSplit_LENGTH(a1),a1
	bra	.remove_loop

.remove_ready:
	rts

	;d0 = 1.Zeile des neuen Splits.
	;d1 = Hhe des neuen Splits (Nur die Hhe des HBLs einrechnen)

.insert_split:
	moveq	#0,d7					;Overwrite-flag lschen
	add.w	d0,d1					;letzte Zeile des Splits ausrechnen.
	lea	TSplit_Buffer-TSplit_LENGTH(a6),a0
.search:
	adda.w	#TSplit_LENGTH,a0
	tst.w	TSplit_Wait(a0)				;Ende der Tabelle erreicht, einfgen!
	bmi.s	.insert
	cmp.w	TSplit_Wait(a0),d0
	beq.s	.over_write				;Die Stelle ist gleich, berschreiben.
	blt.s	.found
	cmp.w	TSplit_YSize(a0),d0			;Der neue Split berlappt den alten,
	blt.s	.over_write				;der alte mu berschrieben werden!
	bra.s	.search

.found:
	cmp.w	TSplit_Wait(a0),d1			;Der neue Split berlappt den alten,
	bge.s	.over_write				;der alte mu berschrieben werden!

.insert:
	st	d7					;War ein insert!
	lea	TSplit_LENGTH(a5),a5			;Der untere Split hat sich ggf. verschoben!
	lea	TSplit_Buffer+14*TSplit_LENGTH(a6),a1
.insert_loop:
	move.l	(a1),TSplit_LENGTH(a1)
	move.l	4(a1),TSplit_LENGTH+4(a1)
	move.l	8(a1),TSplit_LENGTH+8(a1)
	move.w	12(a1),TSplit_LENGTH+12(a1)
	cmp.l	a1,a0
	bge.s	.over_write
	lea	-TSplit_LENGTH(a1),a1
	bra.s	.insert_loop
.over_write:
	rts

*************************************************************************************************
*******	Sprite Routinen									 ********
*************************************************************************************************

Show_Sprite_balken:
	lea	Vertikal_XScroll_Table(pc),a3

	move.w	Scr_Y_Level_Pos(a6),d3
	lsr.w	#6,d3

	moveq	#0,d1
	move.w	Scr_Y_Level_Pos(a6),d1
	neg.w	d1
	and.w	#63,d1
	bne.s	.no_correct

	subq.w	#1,d3

.no_correct:
	lsr.w	#1,d1

	add.w	#128-32,d1			;Hier sitzt das oberste Objekt (-31-0)

	move.w	Scr_Y_Level_Pos(a6),d4
	add.w	#256-65,d4
	lsr.w	#8,d4
	add.w	d4,d4
	lea	(a3,d4.w),a3

	and.w	#3,d3

	;Errechnen, wo die Balken sitzen

	moveq	#0,d0
	move.w	Scr_X_Level_Pos(a6),d0
	add.w	(a3)+,d0
	neg.w	d0
	lsr.w	#1,d0
	divu	#352,d0
	swap	d0
	add.w	#128-32,d0

	move.w	Sig_LinkData(a6),d4
	move.l	Sig_VRam_Pointer(a6),a4

	bsr	.show_sprite
	add.w	#32,d1
	bsr	.show_sprite
	add.w	#32,d1
	bsr	.show_sprite
	add.w	#32,d1

	bsr	.show_sprite
	add.w	#32,d1
	bsr	.show_sprite
	add.w	#32,d1
	bsr	.show_sprite

	move.w	d4,Sig_LinkData(a6)
	move.l	a4,Sig_VRam_Pointer(a6)

	rts

.show_sprite:
	tst.w	d3
	bne.s	.no_add
	add.w	#32,d1
	addq.w	#1,d3

	moveq	#0,d0
	move.w	Scr_X_Level_Pos(a6),d0
	add.w	(a3)+,d0
	neg.w	d0
	lsr.w	#1,d0
	divu	#352,d0
	swap	d0
	add.w	#128-32,d0

.no_add:
	move.w	d1,(a4)+
	move.b	#$0f,(a4)+
	move.b	d4,(a4)+
	move.w	#$2000+Tekkno_SpriteVRam/32,(a4)+
	move.w	d0,(a4)+
	addq.w	#1,d4
	addq.w	#1,d3
	and.w	#3,d3

	rts

Vertikal_XScroll_Table:
	dc.w	95,180,20,220,100
	dc.w	120,75,300,92
	dc.w	105,172,240


*************************************************************************************************
*******	HBL Handler									 ********
*************************************************************************************************

Copper_TekknoSplit_NoCols:
	move.l	#$40000010+$00020000,$c00004		;Vertikaler Split
	move.w	TCopper_Help(a6),$c00000

	move.w	#$2700,sr

	movem.l	a0/d0-d1,-(sp)

	;SetColor
	move.w	TCopper_Help+4(a6),d0

	move.l	Copper_Pointer(a6),a0
	move.w	(a0)+,d0			;In Dieser Zeile wird der Nchste Ausgelst!
	move.l	(a0)+,Int_HBlank+2(a6)
	move.l	a0,Copper_Pointer(a6)
	move.w	(a0),d1
	sub.w	d0,d1
	subq.w	#1,d1
	and.w	#$ff,d1
	or.w	#$8a00,d1
	move.w	d1,$c00004

	move.l	#$40000000+$30020003,$c00004		;Horizontaler Split
	move.w	TCopper_Help+2(a6),$c00000

	move.l	TCopper_TabPointer(a6),a0
	move.l	(a0)+,TCopper_Help(a6)
	move.w	(a0)+,TCopper_Help+4(a6)
	move.l	a0,TCopper_TabPointer(a6)

	movem.l	(sp)+,a0/d0-d1
	rte

Copper_TekknoSplit:
	move.l	#$40000010+$00020000,$c00004		;Vertikaler Split
	move.w	TCopper_Help(a6),$c00000
	move.l	#$40000000+$30020003,$c00004		;Horizontaler Split
	move.w	TCopper_Help+2(a6),$c00000

	move.w	#$2700,sr

	movem.l	a0/d0-d1,-(sp)

	;SetColor
	move.w	TCopper_Help+4(a6),d0

	lea	Tekkno_PCol1(a6),a0
	lea	(a0,d0.w),a0

.waithbl:
	cmp.b	#255/2,$c00009
	blo.s	.waithbl

	move.l	(a0)+,d0
	move.w	(a0)+,d1
	move.l	a0,-(sp)
	lea	$c00000,a0
	move.l	#$c0740000,4(a0)
	move.l	d0,(a0)
	move.w	d1,(a0)

.waithbloff:
	btst	#2,$c00005
	bne.s	.waithbloff

	move.l	Copper_Pointer(a6),a0
	move.w	(a0)+,d0			;In Dieser Zeile wird der Nchste Ausgelst!
	move.l	(a0)+,Int_HBlank+2(a6)
	move.l	a0,Copper_Pointer(a6)
	move.w	(a0),d1
	sub.w	d0,d1
	subq.w	#1,d1
	and.w	#$ff,d1
	or.w	#$8a00,d1
	move.w	d1,$c00004

	move.l	TCopper_TabPointer(a6),a0
	move.l	(a0)+,TCopper_Help(a6)
	move.w	(a0)+,TCopper_Help+4(a6)
	move.l	a0,TCopper_TabPointer(a6)

	move.l	(sp)+,a0

.waithbl2:
	cmp.b	#255/2,$c00009
	blo.s	.waithbl2

	nop

	move.l	(a0)+,d0
	move.w	(a0)+,d1
	lea	$c00000,a0
	move.l	#$c07a0000,4(a0)
	move.l	d0,(a0)
	move.w	d1,(a0)

	movem.l	(sp)+,a0/d0-d1
	rte

Copper_InitTekkno:
	move.l	a0,-(sp)

	move.l	TYPos_Pointer(a6),a0
	move.l	#$40000010+$00020000,$c00004
	move.w	(a0)+,$c00000
	move.l	#$40000000+$30020003,$c00004
	move.w	(a0)+,$c00000
	move.w	(a0)+,d0			;Color-List
	move.l	(a0)+,TCopper_Help(a6)
	move.w	(a0)+,TCopper_Help+4(a6)
	move.l	a0,TCopper_TabPointer(a6)

	move.l	TVBL_Handler(a6),a0
	jsr	(a0)

	lea	Tekkno_PCol1(a6),a0
	lea	(a0,d0.w),a0

	move.l	#$c0740000,$c00004

	move.l	(a0)+,$c00000
	move.l	(a0)+,$c00000
	move.l	(a0)+,$c00000

	move.l	(sp)+,a0
	rts

Copper_TekknoWaterSplit:
	move.l	#$40000010+$00020000,$c00004		;Vertikaler Split
	move.w	TCopper_Help(a6),$c00000
	move.l	#$40000000+$30020003,$c00004		;Horizontaler Split
	move.w	TCopper_Help+2(a6),$c00000

Copper_TekknoWater:
	move.l	Water_Color(a6),$c00004
	move.w	#$2700,sr
	movem.l	a0/d0-d1,-(sp)

	lea	$c00004,a0
	move.l	#$c0000080,HBL_Help(a6)
	move.l	#$81348f02,(a0)
	move.l	#$932a9400,(a0)
	move.l	#$95009600+($10000*(TFade_Struktur+Fade_Palette+WorkRam)>>1)&$ff0000+((TFade_Struktur+Fade_Palette+WorkRam)>>9)&$ff,(a0)
	move.w	#$9700+((TFade_Struktur+Fade_Palette+WorkRam)>>17)&$ff,(a0)
	move.w	HBL_Help(a6),(a0)
	move.w	HBL_Help+2(a6),(a0)
	move.w	#$8124,(a0)

	move.l	TCopper_TabPointer(a6),a0
	move.l	(a0)+,TCopper_Help(a6)
	move.w	(a0)+,TCopper_Help+4(a6)
	move.l	a0,TCopper_TabPointer(a6)

	move.l	#$81648700,$c00004

	move.l	Copper_Pointer(a6),a0
	move.w	(a0)+,d0			;In Dieser Zeile wird der Nchste Ausgelst!
	move.l	(a0)+,Int_HBlank+2(a6)
	move.l	a0,Copper_Pointer(a6)
	move.w	(a0),d1
	sub.w	d0,d1
	subq.w	#1,d1
	or.w	#$8a00,d1
	move.w	d1,$c00004

	movem.l	(sp)+,a0/d0-d1
	rte

TSet_Dark_Color:
	lea	$c00004,a0
	move.l	#$c0000080,HBL_Help(a6)
	move.l	#$81748f02,(a0)
	move.l	#$932a9400,(a0)
	move.l	#$95009600+($10000*(TFade_Struktur+Fade_Palette+WorkRam)>>1)&$ff0000+((TFade_Struktur+Fade_Palette+WorkRam)>>9)&$ff,(a0)
	move.w	#$9700+((TFade_Struktur+Fade_Palette+WorkRam)>>17)&$ff,(a0)
	move.w	HBL_Help(a6),(a0)
	move.w	HBL_Help+2(a6),(a0)
	move.w	#$8164,(a0)
	rts

TLax_Entry_Tab
LAXCL4		*---------------- LAX 01
		dc.w	0		;Lax_Y_WaitPos
		dc.w	12		;Lax_Pos_Val/16
		dc.w	8*16		;Lax_Pos_Divu/Wort
		dc.w	4		;Lax_Own_Speed
		dc.w	ColTab_Clouds_4-Tekkno_PCol1	;Lax_ColTab
LAXCL3		*---------------- LAX 02
		dc.w	40		;Lax_Y_WaitPos
		dc.w	09		;Lax_Pos_Val/16
		dc.w	4*16		;Lax_Pos_Divu/Wort
		dc.w	3		;Lax_Own_Speed
		dc.w	ColTab_Clouds_3-Tekkno_PCol1	;Lax_ColTab
LAXCL2		*---------------- LAX 03
		dc.w	64		;Lax_Y_WaitPos
		dc.w	6		;Lax_Pos_Val/16
		dc.w	2*16		;Lax_Pos_Divu/Wort
		dc.w	2		;Lax_Own_Speed
		dc.w	ColTab_Clouds_2-Tekkno_PCol1	;Lax_ColTab
LAXCL1		*---------------- LAX 04
		dc.w	74		;Lax_Y_WaitPos
		dc.w	3		;Lax_Pos_Val/16
		dc.w	1*16		;Lax_Pos_Divu/Wort
		dc.w	1		;Lax_Own_Speed
		dc.w	ColTab_Clouds_1-Tekkno_PCol1	;Lax_ColTab
*---------------------- City-Light
LAXCL0		*---------------- LAX 05
		dc.w	80		;Lax_Y_WaitPos
		dc.w	3		;Lax_Pos_Val/16
		dc.w	1*16		;Lax_Pos_Divu/Wort
		dc.w	0		;Lax_Own_Speed
		dc.w	ColTab_Clouds_0-Tekkno_PCol1	;Lax_ColTab
*---------------------- City City City
LAXCI1		*---------------- LAX 06
		dc.w	96		;Lax_Y_WaitPos
		dc.w	1		;Lax_Pos_Val/16
		dc.w	168		;Lax_Pos_Divu/Wort
		dc.w	0		;Lax_Own_Speed
		dc.w	ColTab_City_Big-Tekkno_PCol1	;Lax_ColTab
LAXCI2		*---------------- LAX 07
		dc.w	152		;Lax_Y_WaitPos
		dc.w	2		;Lax_Pos_Val/16
		dc.w	4*16		;Lax_Pos_Divu/Wort
		dc.w	0		;Lax_Own_Speed
		dc.w	ColTab_City_Small-Tekkno_PCol1	;Lax_ColTab
LAXGR1		*---------------- LAX 08
		dc.w	176		;Lax_Y_WaitPos
		dc.w	3		;Lax_Pos_Val/16
		dc.w	3*16		;Lax_Pos_Divu/Wort
		dc.w	0		;Lax_Own_Speed
		dc.w	ColTab_Ground_1-Tekkno_PCol1	;Lax_ColTab
LAXGR2		*---------------- LAX 09
		dc.w	184		;Lax_Y_WaitPos
		dc.w	4		;Lax_Pos_Val/16
		dc.w	3*16		;Lax_Pos_Divu/Wort
		dc.w	0		;Lax_Own_Speed
		dc.w	ColTab_Ground_2-Tekkno_PCol1	;Lax_ColTab
LAXGR3		*---------------- LAX 10
		dc.w	198		;Lax_Y_WaitPos
		dc.w	6		;Lax_Pos_Val/16
		dc.w	4*16		;Lax_Pos_Divu/Wort
		dc.w	0		;Lax_Own_Speed
		dc.w	ColTab_Ground_3-Tekkno_PCol1	;Lax_ColTab

		;LAX_END LAX_END LAX_END LAX_END LAX_END
		dc.l	LAX_END

Tekkno_Para_Palette:
		dc.w	$0000,$0C8A,$0C2A,$0806,$0402,$02AA,$0286,$0260
		dc.w	$0240,$086A,$022A,$0206,$0204,$020A,$020A,$020A

		dc.w	$0C2A,$0CAA,$0CA0,$0860,$0400,$0866,$0422,$0400
		dc.w	$02AA,$0CA6,$0C80,$0C40,$0800,$024A,$0208,$0204

		dc.w	$0000,$0C88,$0ECC,$0846,$000E,$000C,$000A,$0006	;Mr-Nutz
		dc.w	$0000,$0EEE

		dc.w	$616,$d9d,$c6c,$828,$ece,$524
		dc.w	$524,$d8c,$b6a,$726,$fbe,$523
		dc.w	$523,$c7b,$a68,$735,$e9d,$633
		dc.w	$633,$c69,$b57,$834,$e7b,$804
		dc.w	$804,$703,$603,$402,$301,$201
		dc.w	$d0d,$424,$000,$0f0,$090,$fff
		dc.w	$ff0,$f80,$d00,$0bf,$03f,$007
		dc.w	$dd9,$bb4,$990,$0ef,$0af,$b6f
		dc.w	$dcb,$a98,$865,$0ef,$08e,$03d
		dc.w	$b9c,$75a,$427,$0ef,$06f,$00a

		rsset	TFade_Struktur+Fade_Palette

Tekkno_PCol1		rs.w	42
ColTab_Clouds_4		rs.w	6
ColTab_Clouds_3		rs.w	6
ColTab_Clouds_2		rs.w	6
ColTab_Clouds_1		rs.w	6
ColTab_Clouds_0		rs.w	6
ColTab_City_Big		rs.w	6
ColTab_City_Small	rs.w	6
ColTab_Ground_1		rs.w	6
ColTab_Ground_2		rs.w	6
ColTab_Ground_3		rs.w	6

;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
;	Parallax Initialisierung

Tekkno_PBase	= Tekkno_ParaVRam/32
Tekkno_PBase2	= Tekkno_Para2VRam/32

;-------------- Initialisiert Parallax-Playfield
Init_TekknoParallax:

	move.w	#$2700,sr

	move.l	#$40000010+$00020000,$c00004
	move.w	#$0000,$c00000			;Ypos auf 0 initialisieren.
	move.l	#$40000000+$30020003,$c00004

	move	#$8f02,$c00004

	move	#$c000,d0

	lea	tekkno_parablock1(pc),a0	;Adresse des Blocks
	moveq	#5-1,d7				;Hhe des Blocks
	moveq	#16-1,d6			;Breite des Blocks
	moveq	#4-1,d5				;Sooft nebeneinander darstellen!

	bsr	.copy_block

	lea	tekkno_parablock1+5*48(pc),a0	;Adresse des Blocks
	moveq	#3-1,d7				;Hhe des Blocks
	moveq	#8-1,d6				;Breite des Blocks
	moveq	#8-1,d5				;Sooft nebeneinander darstellen!

	bsr	.copy_block

	lea	tekkno_parablock1+0*48+32(pc),a0	;Adresse des Blocks
	moveq	#2-1,d7				;Hhe des Blocks
	moveq	#4-1,d6				;Breite des Blocks
	moveq	#16-1,d5				;Sooft nebeneinander darstellen!
	bsr	.copy_block

	lea	tekkno_parablock1+2*48+32(pc),a0	;Adresse des Blocks
	moveq	#2-1,d7				;Hhe des Blocks
	moveq	#2-1,d6				;Breite des Blocks
	moveq	#32-1,d5			;Sooft nebeneinander darstellen!

	bsr	.copy_block

	lea	tekkno_parablock1+8*48+0(pc),a0
	moveq	#7-1,d7				;Hhe des Blocks
	moveq	#21-1,d6			;Breite des Blocks
	moveq	#3-1,d5				;Sooft nebeneinander darstellen!

	bsr	.copy_block

	lea	tekkno_parablock1+5*48+16(pc),a0	;Adresse des Blocks
	moveq	#3-1,d7				;Hhe des Blocks
	moveq	#8-1,d6				;Breite des Blocks
	moveq	#8-1,d5				;Sooft nebeneinander darstellen!

	bsr	.copy_block

	lea	tekkno_parablock1+16*48(pc),a0	;Adresse des Blocks
	moveq	#6-1,d7				;Hhe des Blocks
	moveq	#24-1,d6			;Breite des Blocks
	moveq	#2-1,d5				;Sooft nebeneinander darstellen!

	bsr	.copy_block

	lea	tekkno_parablock2(pc),a0
	moveq	#4-1,d6
.copyloop2:
	jsr	SetVRamAdress
	moveq	#4-1,d5
.copyloop3:
	moveq	#16-1,d7
	lea	(a0),a1
.copyloop:
	move.w	(a1)+,d1
	add.w	#Tekkno_PBase2,d1
	move.w	d1,$c00000
	dbf	d7,.copyloop

	dbf	d5,.copyloop3

	add.w	#$80,d0
	lea	32(a0),a0
	dbf	d6,.copyloop2


	;Create CopperLists

	lea	Tekkno_CopperList1(a6),a0
	lea	Tekkno_CopperList2(a6),a1

	move.l	#Copper_InitTekkno,(a0)+
	move.l	#Copper_InitTekkno,(a1)+

	move.w	#$ff,(a0)+
	move.w	#$ff,(a1)+
	move.l	#Int_Nop,(a0)+
	move.l	#Int_Nop,(a1)+

	lea	TYPos_Table1(a6),a0
	lea	TYPos_Table2(a6),a1
	move.l	a0,TYPos_Pointer(a6)
	move.l	a1,TYPos_Buffer(a6)
	moveq	#66-1,d7
.clear:
	clr.w	(a0)+
	clr.w	(a1)+
	dbf	d7,.clear

	move.l	#Set_Nothing,UVBL_Handler(a6)

	move.l	#Init_TekknoParaFadeOut,Init_ParaFadeOut(a6)
	move.l	#Set_Nothing,TVBL_Handler(a6)
	move.l	#TFade_Struktur+Fade_Palette+64+WorkRam,UnderWaterColors(a6)

	move.w	#$8b00,$c00004
	sf	Scr_SplitScroll(a6)
	clr.w	TBalken_Flag(a6)

	move.w	#$2300,sr

	lea	TFade_Struktur(a6),a0
	lea	Black_Coltab,a1
	lea	Tekkno_Para_Palette(pc),a2

	move.w	#42+60-1,d0
	bsr	Init_Transformation

	move.l	#-1,a0
	jsr	Search_Mickey_Main
	move.l	#MakeTekknoPara,(a5)+
	move.l	#Make_WaterLevel,(a5)+
	move.l	#-1,(a5)

		*TEKKNO
	move.w	#5*64,UnderWaterMax(a6)
	move.w	#6,UnderWaterShift(a6)
	move.w	#0,UnderWaterTest(a6)

	lea	Main_Rout_Table+4(a6),a0
	lea	Show_WaterSprites,a1
	jsr	Insert_Main_Rout

	jsr	Init_WaterEffekt

	move.l	#Tekkno_CopperList1+WorkRam,Copper_List(a6)
	move.l	#Tekkno_CopperList2+WorkRam,TCopper_Buffer(a6)

	rts

.copy_block:
.loop2:
	jsr	SetVRamAdress

	move.w	d5,d4
.loop1:
	move.l	a0,a1
	move.w	d6,d3
.loop0:
	move	(a1)+,d1
	add.w	#Tekkno_PBase,d1
	move.w	d1,$c00000
	dbf	d3,.loop0
	dbf	d4,.loop1

	lea	48(a0),a0
	add	#$80,d0
	dbf	d7,.loop2
	rts

Init_TekknoParaFadeOut:
	lea	TFade_Struktur(a6),a0
	lea	Tekkno_Para_Palette(pc),a1
	lea	Black_Coltab,a2

	move.w	#42+60-1,d0
	jmp	Init_Transformation

Init_TekknoWaterParallax:
	;Create CopperLists

	lea	Tekkno_CopperList1(a6),a0
	lea	Tekkno_CopperList2(a6),a1
	move.l	#Copper_InitTekkno,(a0)+
	move.w	#$ff,(a0)+
	move.l	#Copper_InitTekkno,(a1)+
	move.w	#$ff,(a1)+
	move.l	#Copper_TekknoWater,(a0)+
	move.w	#$ff,(a0)+
	move.l	#Copper_TekknoWater,(a1)+
	move.w	#$ff,(a1)+
	move.l	#Int_Nop,(a0)+
	move.l	#Int_Nop,(a1)+

	lea	TYPos_Table1(a6),a0
	lea	TYPos_Table2(a6),a1
	move.l	a0,TYPos_Pointer(a6)
	move.l	a1,TYPos_Buffer(a6)
	moveq	#66-1,d7
.clear:
	clr.w	(a0)+
	clr.w	(a1)+
	dbf	d7,.clear

	lea	Main_Rout_Table+0*4(a6),a0
	lea	Make_TekknoWaterParallax(pc),a1
	jsr	Insert_Main_Rout

	move.l	#-1,a0
	jsr	Search_Mickey_Main
	move.l	#Make_WaterLevel,(a5)+
	move.l	#-1,(a5)

	jsr	Init_WaterEffekt

	move.l	#Init_TekknoParaFadeOut,Init_ParaFadeOut(a6)
	move.l	#Set_Nothing,TVBL_Handler(a6)
	move.l	#TFade_Struktur+Fade_Palette+64+WorkRam,UnderWaterColors(a6)

	lea	TFade_Struktur(a6),a0
	lea	Black_Coltab,a1
	lea	Tekkno_Para_Palette(pc),a2

	move.w	#42-1,d0
	bsr	Init_Transformation

	move.l	#Tekkno_CopperList1+WorkRam,Copper_List(a6)
	move.l	#Tekkno_CopperList2+WorkRam,TCopper_Buffer(a6)

	rts

Make_TekknoWaterParallax:
	move.l	Copper_List(a6),a3

	move.w	Water_YPos(a6),d0				;Y-Pos der Wasser-oberflche.
	sub.w	Scr_Y_Level_Pos(a6),d0
	move.w	d0,Water_SpritePos(a6)
	cmp.w	#2,d0
	bgt.s	.check_lower_border
	move.l	#Platsch_VSRAM_Dark,TVBL_Handler(a6)
	cmp.w	#1,d0
	bge.s	.set_water
	bra.s	.no_water

.check_lower_border:
	move.l	#Platsch_VSRAM_Light,TVBL_Handler(a6)
	cmp.w	#222,d0
	bge.s	.no_water
.set_water:
	move.w	d0,4(a3)
	bra	.water_finished

.no_water:
	move.w	#$ff,4(a3)

.water_finished:
	jsr	Show_WaterSprites

	lea	TFade_Struktur(a6),a0
	bsr	Call_Transformation2

	move.l	TCopper_Buffer(a6),a0
	move.l	Copper_List(a6),TCopper_Buffer(a6)
	move.l	a0,Copper_List(a6)

	rts

tekkno_parablock1:	incbin	work:sega/sources/mr_nutz/binary/tekkno/tekkno_para1.map
tekkno_parablock2:	incbin	work:sega/sources/mr_nutz/binary/tekkno/tekkno_para2.map

	ENDC
*NEONNEONNEONNEONNEONNEON*
